iT邦幫忙

2023 iThome 鐵人賽

DAY 27
0

梯度(Gradient)

  • 是目標函數在某個點的局部斜率或變化率。
    https://chart.googleapis.com/chart?cht=tx&chl=%5C%5B%20%5Cnabla%20f%20%3D%20%5Cleft%5B%20%5Cfrac%7B%5Cpartial%20f%7D%7B%5Cpartial%20x_1%7D%2C%20%5Cfrac%7B%5Cpartial%20f%7D%7B%5Cpartial%20x_2%7D%2C%20%5Cldots%2C%20%5Cfrac%7B%5Cpartial%20f%7D%7B%5Cpartial%20x_n%7D%20%5Cright%5D%20%5C%5D

梯度提升(Gradient Boosting)

  • 集成學習
  • 多個弱學習器(通常是決策樹),逐步提升整個模型的性能。
  • 梯度提升遞迴公式
  • 在每一個迭代中,模型嘗試最小化損失函數(通常是均方誤差或交叉熵損失),計算出損失函數對於預測的梯度。
F_m(x) = F_(m-1)(x) + γ * h_m(x)
  • F_m(x) 是第 m 輪的模型預測。
  • F_(m-1)(x) 是前一輪的模型預測。
  • γ 是學習率,用於調整每個新弱學習器的貢獻。
  • h_m(x) 是第 m 輪新增的弱學習器的預測。
  1. 定義初始的預測https://chart.googleapis.com/chart?cht=tx&chl=%20%5C(F_0(x)%5C)
  2. 計算當前模型的殘差 https://chart.googleapis.com/chart?cht=tx&chl=%5C(r_i%5C)
    https://chart.googleapis.com/chart?cht=tx&chl=%5C%5B%20r_i%20%3D%20y_i%20-%20F_%7Bi-1%7D(x_i)%20%5C%5D

這裡,https://chart.googleapis.com/chart?cht=tx&chl=%5C(y_i%5C)%20是實際觀測值,https://chart.googleapis.com/chart?cht=tx&chl=%5C(F_%7Bi-1%7D(x_i)%5C) 是前一個模型的預測。

  1. 擬合一個新的學習器 https://chart.googleapis.com/chart?cht=tx&chl=%5C(h_i(x)%5C),以最小化殘差的平方誤差:

https://chart.googleapis.com/chart?cht=tx&chl=%5C%5B%20h_i(x)%20%3D%20%5Carg%5Cmin_h%20%5Csum_%7Bi%3D1%7D%5En%20(y_i%20-%20%5BF_%7Bi-1%7D(x_i)%20%2B%20h(x_i)%5D)%5E2%20%5C%5D

  1. 更新模型 https://chart.googleapis.com/chart?cht=tx&chl=%5C(F_i(x)%20%3D%20F_%7Bi-1%7D(x)%20%2B%20h_i(x)%5C)

  2. 重複上述過程,直到達到停止條件。

GBDT

  • Pros
    • 快速、可平行化
    • 泛化表達力好
    • 解釋性好、強健
  • Cons
    • 稀疏資料不如SVM、NN
    • Text較不明顯
    • 串列方式只能在DT內部採用一些局部平行手段 => Speed up

梯度提升的變體

  • 梯度提升有多個變體
  • XGBoost 和 LightGBM 支持 GPU 加速,這可以極大地提高訓練速度
    • XGBoost:梯度提升框架,以其高效性和性能而聞名。
    • CatBoost:針對類別特徵進行了優化的梯度提升算法,通常用於表格數據。
    • LightGBM:輕量級梯度提升框架,使用了基於葉子的算法以提高效率。
    • Gradient Boosted Trees (GBT):標準的梯度提升方法,也可用於分類和回歸。

LightGBM

  • leaf-wise tree algorithm
  • 優點
    • 更快的訓練速度和更高的效率
    • 低記憶體使用率
    • 更好的準確度
    • 支援 GPU 平行運算
    • 能夠處理大規模數據
  • 缺點
    • 較容易過擬合

實作

import lightgbm as lgb
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
from sklearn.preprocessing import StandardScaler
from sklearn.feature_selection import SelectKBest, f_classif

# 載入數據
data = load_iris()
X = data.data
y = data.target

# 特徵工程
scaler = StandardScaler()
X = scaler.fit_transform(X)

# 特徵選擇
k_best = SelectKBest(f_classif, k=2)
X = k_best.fit_transform(X, y)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 創建LightGBM分類器並配置超參數
params = {
    'objective': 'multiclass',
    'num_class': 3,  # 三個類別
    'boosting_type': 'gbdt',
    'metric': 'multi_logloss',
    'num_leaves': 31,
    'learning_rate': 0.05,
    'feature_fraction': 0.9,
    'bagging_fraction': 0.8,
    'bagging_freq': 5,
}

model = lgb.LGBMClassifier(**params)

# 訓練模型
model.fit(X_train, y_train)
y_pred = model.predict(X_test)

# 計算準確度
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)

# 混淆矩陣
confusion = confusion_matrix(y_test, y_pred)

# 分類報告
class_report = classification_report(y_test, y_pred)
lgb.plot_importance(model, max_num_features=2)
plt.show()


plt.imshow(confusion, interpolation='nearest', cmap=plt.cm.Blues)
plt.title("Confusion Matrix")
plt.colorbar()
tick_marks = [0, 1, 2]
plt.xticks(tick_marks, [str(i) for i in range(3)])
plt.yticks(tick_marks, [str(i) for i in range(3)])
plt.xlabel("Predicted")
plt.ylabel("True")
for i in range(3):
    for j in range(3):
        plt.text(j, i, confusion[i, j], horizontalalignment="center", color="white" if confusion[i, j] > confusion.max() / 2 else "black")
plt.show()
print("Classification Report:\n", class_report)

https://ithelp.ithome.com.tw/upload/images/20231012/20161144Ejdn6saDnh.png

https://ithelp.ithome.com.tw/upload/images/20231012/20161144R31eaWn5vk.png

Classification Report:
               precision    recall  f1-score   support

           0       1.00      1.00      1.00        10
           1       1.00      1.00      1.00         9
           2       1.00      1.00      1.00        11

    accuracy                           1.00        30
   macro avg       1.00      1.00      1.00        30
weighted avg       1.00      1.00      1.00        30

上一篇
[DAY26] 機器學習 - 決策樹(二)
下一篇
[DAY28] 機器學習 - 自然語言NLP(一)
系列文
關於我從基礎程設轉職到人工智慧入門30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言